#include<random>
#include<iostream>

using std::cin;
using std::cout;
using std::endl;
using std::uniform_int_distribution;
using std::default_random_engine;

//自定义函数 换行
void newLine();
bool checkIsOver();
void setNum(int* p);
void getRandNum(int* p);
bool checkInput();

int main() {
	//初始化
	// *p:最小值 *(p+1):最大值 *(p+2):输出随机数个数
	int* p = new int[3];		//为*p分配动态内存
	bool IsOver = false;		//用于判断程序是否结束

	while (!IsOver) {		//IsOver判断是否结束
		setNum(p);
		newLine();
		getRandNum(p);
		newLine();
		IsOver = checkIsOver();		//将值返还给IsOver判断符
	}
	cout << "程序已退出.." << endl;
	delete[] p;		//释放动态内存
	return 0;
}

//换行
void newLine() {
	cout << endl;
}

//判断程序是否结束
bool checkIsOver() {
	char temp;
	newLine();
	cout << "是否继续输入?(是：y,否:n):";
	for (;;) {
		cin >> temp;
		if (temp == 'y') {
			system("cls");
			return false;
		}
		else if (temp == 'n')
			return true;
		else {
			cout << "输入数据有误!请重新输入:";
			while (cin.get() != '\n');
		}
	}
}

//按用户要求输出随机数
void getRandNum(int* p) {
	uniform_int_distribution<int> u(*p, *(p + 1));		//括号内为范围 为闭区间
	static default_random_engine e(time(0));
	for (int i = 1; i <= *(p + 2); i++) {		//i为伪随机数个数
		cout << "\t" << u(e);
		if (i % 8 == 0)					//每8个数换行
			cout << endl << endl << endl;
	}
}

//记录用户输入最小值及最大值
void setNum(int* p) {
	for (;;) {
		cout << "提示:随机数范围为闭区间" << endl;
		do {
			cout << "输入最小值:";
			cin >> *p;
		} while (!checkInput());
		do {
			cout << "输入最大值:";
			cin >> *(p + 1);
		} while (!checkInput());
		if (*p <= *(p + 1))
			break;
		else {
			system("cls");
			cout << "错误!最小值不能大于最大值!" << endl;
		}
	}
	do {
		cout << "输入输出随机数个数:";
		cin >> *(p + 2);
	} while (!checkInput());
}

bool checkInput() {
	if (cin.fail()) {
		cout << "输入数据有误!请重新输入!" << endl;
		cin.clear();		//将判断符重置
		while (cin.get() != '\n');		//清除缓冲区内所有字符
		return false;
	}
	else
		return true;
}